package com.ywj.demo02_concurrent_problem;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 案例演示: 一个线程对共享变量的修改,另一个线程不能立即得到最新值
 */
public class Test01Visibility {
    private final static Logger LOG = LoggerFactory.getLogger(Test01Visibility.class);
    //1.创建一个共享变量
    //加volatile：当修改的值同步回主内存，有个缓存一致性协议，会把其他工作内存的值全部设置为失效，线程会重新读取共享内存的值
//    private static volatile boolean run = true;
//
//    public static void main(String[] args) throws InterruptedException {
//        //2.创建一个线程不断读取共享变量
//        new Thread(() -> {
//            while(run) {
//            }
//            LOG.info("{} 读取run：{}，线程结束", Thread.currentThread().getName(), run);
////            System.out.println(Thread.currentThread().getName() + "读取run：" + run + "，线程结束");
//        }, "Thread1").start();
//
//        Thread.sleep(1000);
//
//        //3.创建一个线程修改共享变量
//        new Thread(() -> {
//            run = false;
//            LOG.info( "{} 修改run值为：{}", Thread.currentThread().getName(), run);
////            System.out.println(Thread.currentThread().getName() + " 修改run值为：" + run);
//        }, "Thread2").start();
//
//    }


    private static boolean run = true;
    private static Object obj = new Object();
    public static void main(String[] args) {
        //2.创建一个线程不断读取共享变量
        new Thread(() -> {
            while(run) {
                synchronized (obj ) {
                }
            }
            LOG.info("{} 读取run：{}，线程结束", Thread.currentThread().getName(), run);
        }, "Thread1").start();

        //3.创建一个线程修改共享变量
        new Thread(() -> {
            run = false;
            LOG.info( "{} 修改run值为：{}", Thread.currentThread().getName(), run);
        }, "Thread2").start();
    }

}
